package jmine.tec.subscription;

/**
 * Uma {@link Subscription} representa uma 'assinatura' com um {@link Publisher} com alguns criterios.
 * 
 * @author takeshi
 */
public interface Subscription {

    /**
     * Devolve um numero unico que representa esta inscricao. Este numero nao pode ser alterado.
     * 
     * @return long
     */
    long getSubscriptionToken();

    /**
     * Devolve o {@link SubscriptionSet} que contem este {@link Subscription}. O {@link SubscriptionSet} pode ser uma representacao, mas
     * deve ter o token real.
     * 
     * @return {@link SubscriptionSet}
     */
    SubscriptionSet getContainingSet();

    /**
     * Devolve as {@link SubscriptionSettings} que foram usadas para a inscricao deste {@link Subscription}. Idealmente, este
     * {@link SubscriptionSettings} nao deve ser alterado uma vez que este {@link SubscriptionSet} for criado.
     * 
     * @return {@link SubscriptionSettings}
     */
    SubscriptionSettings getSettings();

    /**
     * Devolve o Publisher ao qual esta {@link Subscription} foi criada
     * 
     * @return {@link Publisher}
     */
    Publisher<?> getPublisher();

    /**
     * Devolve a versao desta {@link Subscription}. A versao eh incrementada se houve um novo evento no {@link Publisher} ao qual este
     * {@link Subscription} esta interessado.
     * 
     * @return long
     */
    long getVersion();

    /**
     * Sinaliza que houve um novo evento associado
     */
    void incrementVersion();
}
